package com.zenithmind.version.controller.validator;

import com.zenithmind.version.pojo.dto.RepositoryCreateDTO;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

/**
 * 仓库参数验证器 - 遵循单一职责原则，专门处理仓库相关参数验证
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Component
public class RepositoryParameterValidator {

    /**
     * 验证创建仓库参数
     * 
     * @param createDTO 创建DTO
     * @throws IllegalArgumentException 参数验证失败时抛出
     */
    public void validateCreateRepository(RepositoryCreateDTO createDTO) {
        if (createDTO == null) {
            throw new IllegalArgumentException("创建参数不能为空");
        }
        
        if (!StringUtils.hasText(createDTO.getName())) {
            throw new IllegalArgumentException("仓库名称不能为空");
        }
        
        if (createDTO.getName().length() > 100) {
            throw new IllegalArgumentException("仓库名称长度不能超过100个字符");
        }
        
        if (!isValidRepositoryName(createDTO.getName())) {
            throw new IllegalArgumentException("仓库名称格式不正确，只能包含字母、数字、下划线和连字符");
        }
        
        if (!StringUtils.hasText(createDTO.getOwnerId())) {
            throw new IllegalArgumentException("所有者ID不能为空");
        }
        
        if (createDTO.getType() == null || createDTO.getType() < 1 || createDTO.getType() > 3) {
            throw new IllegalArgumentException("仓库类型必须为1-3之间的值");
        }
    }

    /**
     * 验证分页参数
     * 
     * @param current 当前页
     * @param size 页大小
     * @throws IllegalArgumentException 参数验证失败时抛出
     */
    public void validatePageParameters(Long current, Long size) {
        if (current == null || current < 1) {
            throw new IllegalArgumentException("当前页必须大于0");
        }
        
        if (size == null || size < 1 || size > 100) {
            throw new IllegalArgumentException("页大小必须在1-100之间");
        }
    }

    /**
     * 验证仓库ID
     * 
     * @param id 仓库ID
     * @throws IllegalArgumentException 参数验证失败时抛出
     */
    public void validateRepositoryId(String id) {
        if (!StringUtils.hasText(id)) {
            throw new IllegalArgumentException("仓库ID不能为空");
        }
    }

    /**
     * 验证仓库名称格式
     * 
     * @param name 仓库名称
     * @return 是否有效
     */
    private boolean isValidRepositoryName(String name) {
        if (name == null || name.isEmpty()) {
            return false;
        }
        
        // 仓库名称只能包含字母、数字、下划线和连字符，不能以连字符开头或结尾
        return name.matches("^[a-zA-Z0-9_][a-zA-Z0-9_-]*[a-zA-Z0-9_]$") || 
               name.matches("^[a-zA-Z0-9_]$");
    }

    /**
     * 验证Fork参数
     * 
     * @param sourceRepositoryId 源仓库ID
     * @param name 新仓库名称
     * @throws IllegalArgumentException 参数验证失败时抛出
     */
    public void validateForkParameters(String sourceRepositoryId, String name) {
        validateRepositoryId(sourceRepositoryId);
        
        if (!StringUtils.hasText(name)) {
            throw new IllegalArgumentException("新仓库名称不能为空");
        }
        
        if (!isValidRepositoryName(name)) {
            throw new IllegalArgumentException("新仓库名称格式不正确");
        }
    }

    /**
     * 验证用户ID
     * 
     * @param userId 用户ID
     * @throws IllegalArgumentException 参数验证失败时抛出
     */
    public void validateUserId(String userId) {
        if (!StringUtils.hasText(userId)) {
            throw new IllegalArgumentException("用户ID不能为空");
        }
    }

    /**
     * 验证所有者ID
     * 
     * @param ownerId 所有者ID
     * @throws IllegalArgumentException 参数验证失败时抛出
     */
    public void validateOwnerId(String ownerId) {
        if (!StringUtils.hasText(ownerId)) {
            throw new IllegalArgumentException("所有者ID不能为空");
        }
    }
}
